package CapaLogica;

import Excepciones.ObjetoNoEncontradoException;
import Excepciones.ObjetoDuplicadoException;
import CapaDatos.Cargo;
import CapaDatos.Cliente;
import CapaDatos.Empleado;
import CapaDatos.Fecha;
import CapaDatos.Habitacion;
import CapaDatos.Horario;
import CapaDatos.HorarioSemanal;
import CapaDatos.Restaurant;
import CapaDatos.listas.ListaCargos;
import CapaDatos.listas.ListaEmpleados;
import CapaDatos.listas.ListaRestaurants;
import java.util.LinkedList;
import java.util.List;

public class AdministracionInterna
{
    protected static ListaEmpleados   empleados   = new ListaEmpleados();
    protected static ListaRestaurants restaurants = new ListaRestaurants();
    protected static ListaCargos      cargos      = new ListaCargos();

    // <editor-fold defaultstate="collapsed" desc="Manejo de Habitaciones">
    public static void agregarHabitacion (String tipo, String laSuperficie, String laCapacidad, boolean lista)
            throws ObjetoDuplicadoException, NumberFormatException
    {
        String errorSuperficie = "Por favor ingrese únicamente números para la superficie";
        String errorCapacidad  = "Por favor ingrese únicamente números para la capacidad";
        String estado = (lista ? "Disponible":"En Construcción");
        String ID = Operaciones.reservaciones.obtenerProximoID();
        int superficie, capacidad;

        // Se intenta convertir el valor de la superficie a un entero
        try {
            superficie = Integer.valueOf(laSuperficie);
        }
        catch (NumberFormatException e) {
            throw new NumberFormatException(errorSuperficie);
        }

        // Se intenta convertir el valor de la capacidad a un entero
        try {
            capacidad  = Integer.valueOf(laCapacidad);
        }
        catch (NumberFormatException e) {
            throw new NumberFormatException(errorCapacidad);
        }

        Habitacion habitacion = new Habitacion (tipo, estado, superficie, capacidad);

        if (!Operaciones.habitaciones.agregar(habitacion, true))
            throw new ObjetoDuplicadoException("Ya existe una habitación con el ID " + ID);
    }

    public static void agregarHabitacion (String ID, String tipo, String estado, int superficie, int capacidad, int reservas, List fechas)
            throws ObjetoDuplicadoException
    {
        Habitacion habitacion = new Habitacion (ID, tipo, estado, superficie, capacidad, reservas, fechas);

        if (!Operaciones.habitaciones.agregar(habitacion, false))
            throw new ObjetoDuplicadoException("Ya existe una habitación con el ID " + ID);
    }

    public static String buscarHabitacion (String ID)
            throws ObjetoNoEncontradoException
    {
        Habitacion habitacion = Operaciones.habitaciones.buscar(ID);

        if (habitacion == null)
            throw new ObjetoNoEncontradoException("La habitación no se encuentra en el sistema");

        return habitacion.getID() + ":"
             + habitacion.getTipo() + ":"
             + habitacion.getEstado() + ":"
             + String.valueOf(habitacion.getSuperficie()) + ":"
             + String.valueOf(habitacion.getCapacidad()) + ":"
             + String.valueOf(habitacion.getVecesReservada());
    }

    public static void modificarHabitacion (String ID, String estado)
            throws ObjetoNoEncontradoException
    {
        Habitacion habitacion = Operaciones.habitaciones.buscar(ID);

        if (habitacion == null)
            throw new ObjetoNoEncontradoException("La habitación no se encuentra en el sistema");

        habitacion.setEstado(estado);
        Operaciones.habitaciones.eliminar(ID);
        Operaciones.habitaciones.agregar(habitacion, false);
    }

    public static void eliminarHabitacion (String ID)
            throws ObjetoNoEncontradoException
    {
        if (!Operaciones.habitaciones.eliminar(ID))
            throw new ObjetoNoEncontradoException ("La habitación no se encuentra en el sistema");
    }

    public static String[] obtenerHabitaciones() {
        Habitacion[] arreglo = Operaciones.habitaciones.array();
        int i, l = arreglo.length;
        List <String> lista = new LinkedList();

        for (i = 0; i < l; i++)
        {
            String habitacion =
            (
                  arreglo[i].getID()  + ":"
                + arreglo[i].getTipo() + ":"
                + arreglo[i].getEstado()
            );

            lista.add(habitacion);
        }

        return lista.toArray(new String[0]);
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Manejo de Restaurants">
    public static void agregarRestaurant (String ID, String nombre, String ubicacion, Horario horario, String superficie, String capacidad)
        throws ObjetoDuplicadoException
    {
        Restaurant restaurant = new Restaurant
                (
                    ID, nombre, ubicacion, horario,
                    Integer.parseInt(superficie),
                    Integer.parseInt(capacidad)
                );

        if (!restaurants.agregar(restaurant))
            throw new ObjetoDuplicadoException("Ya existe una restaurant con el ID " + ID);
    }

    public static void agregarRestaurant (Restaurant restaurant)
        throws ObjetoDuplicadoException
    {
        if (!restaurants.agregar(restaurant))
            throw new ObjetoDuplicadoException("Ya existe una restaurant con el ID " + restaurant.getID());
    }

    public static String informacionRestaurant (String ID)
        throws ObjetoNoEncontradoException
    {
        Restaurant restaurant = restaurants.buscar(ID);

        if (restaurant == null)
            throw new ObjetoNoEncontradoException("El restaurant no se encuentra en el sistema");

        return restaurant.getID()        + ":"
             + restaurant.getNombre()    + ":"
             + restaurant.getUbicacion() + ":"
             + restaurant.getHorario()   + ":"
             + restaurant.getCapacidad() + ":"
             + restaurant.getSuperficie();
    }

    public static Object[] obtenerEmpleados (String ID)
        throws ObjetoNoEncontradoException
    {
        Restaurant restaurant = restaurants.buscar(ID);

        if (restaurant == null)
            throw new ObjetoNoEncontradoException("El restaurant no se encuentra en el sistema");

        return restaurant.getEmpleados();
    }

    public static void agregarEmpleado (String ID, String cedula)
        throws ObjetoNoEncontradoException
    {
        Restaurant restaurant = restaurants.buscar(ID);
        Empleado empleado = empleados.buscar(cedula);

        if (empleado == null)
            throw new ObjetoNoEncontradoException("El empleado no se encuentra en el sistema");

        if (restaurant == null)
            throw new ObjetoNoEncontradoException("El restaurant no se encuentra en el sistema");

        restaurant.agregarEmpleado(empleado.copia());
    }

    public static void eliminarEmpleado (String ID, String cedula)
        throws ObjetoNoEncontradoException
    {
        Restaurant restaurant = restaurants.buscar(ID);
        Empleado empleado = empleados.buscar(cedula);

        if (empleado == null)
            throw new ObjetoNoEncontradoException("El empleado no se encuentra en el sistema");

        if (restaurant == null)
            throw new ObjetoNoEncontradoException("El restaurant no se encuentra en el sistema");

        restaurant.eliminarEmpleado(cedula);
    }

    public static void modificarRestaurant (String ID, String nombre, String ubicacion, Horario horario, String superficie, String capacidad)
        throws ObjetoNoEncontradoException
    {
        Restaurant restaurant = new Restaurant
                (
                    ID, nombre, ubicacion, horario,
                    Integer.parseInt(superficie),
                    Integer.parseInt(capacidad)
                );

        if (!restaurants.actualizar(restaurant))
            throw new ObjetoNoEncontradoException("El restaurant no se encuentra en el sistema");
    }

    public static void eliminarRestaurant (String ID)
        throws ObjetoNoEncontradoException
    {
        if (!restaurants.eliminar(ID))
            throw new ObjetoNoEncontradoException("El restaurant no se encuentra en el sistema");
    }

    public static Object[] obtenerRestaurants() {
        return restaurants.array();
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Manejo de Empleados">
    public static void agregarEmpleado (String nombre, String apellido, String cedula, char sexo, char estadoCivil,String fechaNacimiento, String elCargo, String puesto, String descripcionLaboral, String sueldo)
            throws ObjetoDuplicadoException
    {
        Cargo cargo = cargos.buscar(elCargo);
        System.out.println(cargo);

        Empleado empleado = new Empleado
                (
                    nombre, apellido, cedula,
                    sexo, estadoCivil, fechaNacimiento,
                    cargo, puesto, descripcionLaboral,
                    Float.valueOf(sueldo)
                );

        if (!empleados.agregar(empleado))
            throw new ObjetoDuplicadoException("Ya existe un empleado con el número de cédula " + cedula);
    }

    public static void agregarEmpleado (String nombre, String apellido, String cedula, char sexo, char estadoCivil, String fechaNacimiento, String elCargo, String puesto, String descripcionLaboral, HorarioSemanal horario, String elSueldo, boolean asignado)
            throws ObjetoDuplicadoException
    {
        Cargo cargo = cargos.buscar(elCargo);
        Fecha fecha = new Fecha(fechaNacimiento);
        float sueldo = Float.valueOf(elSueldo);

        Empleado empleado = new Empleado
                (
                    nombre, apellido, cedula,
                    sexo, estadoCivil, fecha,
                    cargo, puesto, descripcionLaboral,
                    horario, sueldo, asignado
                );

        if (!empleados.agregar(empleado))
            throw new ObjetoDuplicadoException("Ya existe un empleado con el número de cédula " + cedula);
    }

    public static String buscarEmpleado (String cedula)
            throws ObjetoNoEncontradoException
    {
        Empleado empleado = empleados.buscar(cedula);

        if (empleado == null)
            throw new ObjetoNoEncontradoException("El empleado no se encuentra en el sistema");

        return empleado.getNombre() + ":"
             + empleado.getApellido() + ":"
             + empleado.getSexo() + ":"
             + empleado.getEstadoCivil() + ":"
             + empleado.getFechaNacimiento() + ":"
             + empleado.getCargo() + ":"
             + empleado.getPuesto() + ":"
             + empleado.getDescripcionLaboral() + ":"
             + String.valueOf(empleado.getSueldo());
    }

    public static void modificarEmpleado (String nombre, String apellido, String cedula, char sexo, char estadoCivil, String fechaNacimiento, String elCargo, String puesto, String descripcionLaboral, float sueldo)
            throws ObjetoNoEncontradoException
    {
        Cargo cargo = cargos.buscar(elCargo);

        Empleado empleado = new Empleado
                (
                    nombre, apellido, cedula,
                    sexo, estadoCivil, fechaNacimiento,
                    cargo, puesto, descripcionLaboral, sueldo
                );

        if (!empleados.actualizar(empleado))
            throw new ObjetoNoEncontradoException("El empleado no se encuentra en el sistema");
    }

    public static void eliminarEmpleado (String cedula)
            throws ObjetoNoEncontradoException
    {
        if (!empleados.eliminar(cedula))
            throw new ObjetoNoEncontradoException("El empleado no se encuentra en el sistema");
    }

    public static Object[] obtenerEmpleados() {
        return empleados.array();
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Manejo de Clientes">
    public static void agregarCliente (String nombre, String apellido, String cedula, char sexo, char estadoCivil, String fechaNacimiento, String usuario, String clave, String nacionalidad)
            throws ObjetoNoEncontradoException
    {
        Cliente cliente = new Cliente
                (
                    nombre, apellido, cedula,
                    sexo, estadoCivil, fechaNacimiento,
                    usuario, clave, nacionalidad
                );

        if (!Operaciones.clientes.agregar(cliente))
            throw new ObjetoDuplicadoException("Ya existe un cliente con el número de cédula " + cedula);
    }

    static void agregarCliente(Cliente cliente) {
        Operaciones.clientes.agregar(cliente);
    }

    public static void eliminarCliente (String cedula)
            throws ObjetoNoEncontradoException
    {
        if (!Operaciones.clientes.eliminar(cedula))
            throw new ObjetoNoEncontradoException("El cliente no se encuentra en el sistema");
    }

    public static String buscarCliente (String cedula)
            throws ObjetoNoEncontradoException
    {
        Cliente cliente = Operaciones.clientes.buscarCedula(cedula);

        if (cliente == null)
            throw new ObjetoNoEncontradoException("El cliente no se encuentra en el sistema");

        return cliente.getNombre() + ":"
             + cliente.getApellido() + ":"
             + cliente.getSexo() + ":"
             + cliente.getEstadoCivil() + ":"
             + cliente.getFechaNacimiento() + ":"
             + cliente.getUsuario() + ":"
             + cliente.getClave() + ":"
             + cliente.getNacionalidad();
    }

    public static void modificarCliente (String nombre, String apellido, String cedula, char sexo, char estadoCivil, String fechaNacimiento, String usuario, String clave, String nacionalidad)
            throws ObjetoNoEncontradoException
    {
        Cliente cliente = new Cliente
                (
                    nombre, apellido, cedula,
                    sexo, estadoCivil, fechaNacimiento,
                    usuario, clave, nacionalidad
                );

        if (!Operaciones.clientes.actualizar(cliente))
            throw new ObjetoNoEncontradoException("El cliente no se encuentra en el sistema");
    }

    public static String[] obtenerClientes() {
        Cliente[] arreglo = Operaciones.clientes.array();
        int i, l = arreglo.length;
        List <String> lista = new LinkedList();

        for (i = 0; i < l; i++)
        {
            String cliente =
            (
                  arreglo[i].getCedula()  + ":"
                + arreglo[i].getNombre()  + " " + arreglo[i].getApellido() + ":"
                + arreglo[i].getUsuario() + ":"
                + String.valueOf(arreglo[i].isVIP())
            );

            lista.add(cliente);
        }

        return lista.toArray(new String[0]);
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Manejo de Cargos">
    public static void agregarCargo (String nombre, String sueldoBase)
            throws ObjetoNoEncontradoException
    {
        Cargo cargo = new Cargo
                (
                    nombre,
                    Float.valueOf(sueldoBase)
                );

        if (!cargos.agregar(cargo))
            throw new ObjetoDuplicadoException("Ya existe un cargo con el título " + nombre);
    }

    public static void eliminarCargo (String nombre)
            throws ObjetoNoEncontradoException
    {
        if (!cargos.eliminar(nombre))
            throw new ObjetoNoEncontradoException("El cargo no se encuentra en el sistema");
    }

    public static String buscarCargo (String nombre)
            throws ObjetoNoEncontradoException
    {
        Cargo cargo = cargos.buscar(nombre);

        if (cargo == null)
            throw new ObjetoNoEncontradoException("El cargo no se encuentra en el sistema");

        return String.valueOf(cargo.getSueldoBase());
    }

    public static void modificarCargo (String nombre, String sueldoBase)
            throws ObjetoNoEncontradoException
    {
        Cargo cargo = new Cargo
                (
                    nombre,
                    Float.valueOf(sueldoBase)
                );

        if (!cargos.modificar(cargo))
            throw new ObjetoNoEncontradoException("El cargo no se encuentra en el sistema");
    }

    public static Object[] obtenerCargos() {
        return cargos.array();
    }
    // </editor-fold>
}
